package org.htw.osgi.renderservice;

import org.htw.osgi.renderservice.essentials.IServiceFramework;
import org.osgi.framework.*;
import org.osgi.service.http.*;

/**
 * <p>Diese Klasse ist der Activator von RenderService.</p>
 * 
 * <p>Beim Start des Bundles wird RenderService im HttpService
 * des OSGI Frameworks registriert. Dies ist notwendig,
 * weil der RenderService als Servlet implementiert ist 
 * und der HttpService als Runtime Container für Servlets
 * verwendet werden kann. Nach der Registrierung bei dem
 * HttpService wird RenderService selbst als Service
 * im OSGI Framework registriert. Somit ist RenderService
 * (im Gegensatz zu normalen Bundles) global im Framework
 * zugreifbar.</p>
 * 
 * <p>Wird das Bundle gestoppt, so wird RenderService
 * vom HttpService abgemeldet und steht im Framework
 * nicht mehr als Service zur Verfügung</p>
 *
 * @author  Benjamin Friedrich (<a href="mailto:benjamin_friedrich@gmx.de">mailto:benjamin_friedrich@gmx.de</a>)
 * @version 1.0  Juni 2009
 */
public final class Activator 
implements         BundleActivator 
{	
	private  HttpService         httpService;
	private  ServiceRegistration serviceRegistration;
	
	private final static String ALIAS = "/renderer";
	
	/**
	 * Konstruktor von Activator des RenderService
	 */
	public Activator()
	{	}
		
	/**
	 * Registriert RenderService (Servlet) bei dem OSGI HttpService und veröffentlicht
	 * RenderService als Service im OSGI Framework.
	 * 
	 * @param context Context Objekt für Bundles aus dem OSGI Framework
	 * 				  aus welchem der HttpService extrahiert wird und mit
	 * 				  dem RenderService im OSGI Framework als Service 
	 * 				  registriert wird.
	 */
	@Override
	public void start(BundleContext context) throws Exception 
	{
		final RenderService service = new RenderService();
		
		this.httpService = (HttpService) context.getService( context.getServiceReference(HttpService.class.getName()));
		this.httpService.registerServlet(ALIAS, service, null, null);

		this.serviceRegistration = context.registerService(IServiceFramework.class.getName(), service, null);
	}

	/**
	 * Meldet RenderService von OSGI HttpService ab und entfernt
	 * RenderService Bundle als Service vom OSGI Framework.
	 * 
	 *  @param context Context Objekt für Bundles aus dem OSGI Framework
	 *  			   mit dem die Abmeldung vom OSGI Framework und von dem
	 *  			   HttpService durchgeführt wird. 
	 */
	@Override
	public void stop(BundleContext context) throws Exception 
	{
		this.httpService.unregister(ALIAS);
		this.httpService = null;
		this.serviceRegistration.unregister();
	}
}